//
//  CAKeyAnimationViewController.swift
//  YUANSHI
//
//  Created by pro on 2020/2/3.
//  Copyright © 2020 wangbin. All rights reserved.
//

import UIKit

class CAKeyAnimationViewController: UIViewController {

    let redView = UIView.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    let greedView = UIView.init(frame: CGRect(x: 0, y: 150, width: 100, height: 100))
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        
        redView.backgroundColor = UIColor.red
        self.view.addSubview(redView)
        
        greedView.backgroundColor = UIColor.green
        self.view.addSubview(greedView)
        
        //抖动
        let douBtn = UIButton.init(frame: CGRect(x: kSCREEN_WIDTH-100, y: 0, width: 100, height: 50))
        douBtn.setTitle("抖动动画", for: .normal)
        douBtn.backgroundColor = UIColor.black
        self.view.addSubview(douBtn)
        douBtn.addTarget(self, action: #selector(douDongEven), for: .touchUpInside)
        
        //路径动画
        let luBtn = UIButton.init(frame: CGRect(x: kSCREEN_WIDTH-100, y: 60, width: 100, height: 50))
        luBtn.setTitle("路径动画", for: .normal)
        luBtn.backgroundColor = UIColor.black
        self.view.addSubview(luBtn)
        luBtn.addTarget(self, action: #selector(lujinEven), for: .touchUpInside)
        
        let yuanLuJinBtn = UIButton.init(frame: CGRect(x: kSCREEN_WIDTH-100, y: 120, width: 100, height: 50))
        yuanLuJinBtn.setTitle("圆周动画", for: .normal)
        yuanLuJinBtn.backgroundColor = UIColor.black
        self.view.addSubview(yuanLuJinBtn)
        yuanLuJinBtn.addTarget(self, action: #selector(yuanlujinEven), for: .touchUpInside)
        
        
    }
    @objc func yuanlujinEven(){
        // 创建动画对象
        let animation = CAKeyframeAnimation(keyPath: "position")
        // 创建一个CGPathRef对象，就是动画的路线
        let path = CGMutablePath()
        //  自动沿着弧度移动
        //xy 动画起点的位置 width，height 动画从左到右从上到下的位置
//        path.addEllipse(in: CGRect(x: 0, y: 50, width: kSCREEN_WIDTH, height: 100))
        // 线性需要设置设置开始位置
//        path.move(to: CGPoint(x: 0, y: 150))
//        path.addLine(to: CGPoint(x: kSCREEN_WIDTH, y: 150))
        //曲线动画 三个参数控制起点 弧度的拐点 终点
        path.move(to: CGPoint(x: 0, y: kSCREEN_HEIGHT))
        path.addCurve(to:CGPoint(x: kSCREEN_HEIGHT, y: kSCREEN_HEIGHT/2.0),
        control1: CGPoint(x: kSCREEN_HEIGHT/4.0, y: kSCREEN_HEIGHT/4.0),
        control2: CGPoint(x: kSCREEN_HEIGHT/2.0, y: kSCREEN_HEIGHT/2.0))

        animation.path = path
        animation.autoreverses = true
        animation.repeatCount = MAXFLOAT
        animation.isRemovedOnCompletion = false
        animation.fillMode = CAMediaTimingFillMode.forwards
        animation.duration = 3.0
        animation.timingFunctions = [CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeIn)]
        animation.delegate = self
        
        greedView.layer.add(animation, forKey: nil)
        
        
        
        
    }
    @objc func lujinEven(){
        /*
         提供一组关键帧位置，使得动画view的中心依次落在这些关键点上，形成动画
         */
        let animation = CAKeyframeAnimation(keyPath: "position")
        let value1: NSValue = NSValue(cgPoint: CGPoint(x: 100, y: 100))
        let value2: NSValue = NSValue(cgPoint: CGPoint(x: 200, y: 100))
        let value3: NSValue = NSValue(cgPoint: CGPoint(x: 200, y: 200))
        let value4: NSValue = NSValue(cgPoint: CGPoint(x: 100, y: 200))
        let value5: NSValue = NSValue(cgPoint: CGPoint(x: 100, y: 300))
        let value6: NSValue = NSValue(cgPoint: CGPoint(x: 200, y: 400))
        animation.values = [value1, value2, value3, value4, value5, value6]
        
        animation.repeatCount = MAXFLOAT //设置动画的运行次数 MAXFLOAT无限循环
        animation.autoreverses = true //会从路径的末尾移动到开始 如果为false则直接从头开始
        animation.duration = 4.0 //完成路劲所用的时间
        animation.isRemovedOnCompletion = true
        animation.fillMode = CAMediaTimingFillMode.forwards
        animation.timingFunctions = [CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)] //设计动画的运行的模式
//    kCAMediaTimingFunctionLinear选项创建了一个线性的计时函数，同样也是CAAnimation的timingFunction属性为空时候的默认函数。线性步调对于那些立即加速并且保持匀速到达终点的场景会有意义(例如射出枪膛的子弹)，但是默认来说它看起来很奇怪，因为对大多数的动画来说确实很少用到。
//
//    kCAMediaTimingFunctionEaseIn常量创建了一个慢慢加速然后突然停止的方法。对于之前提到的自由落体的例子来说很适合，或者比如对准一个目标的导弹的发射。
//
//    kCAMediaTimingFunctionEaseOut则恰恰相反，它以一个全速开始，然后慢慢减速停止。它有一个削弱的效果，应用的场景比如一扇门慢慢地关上，而不是砰地 一声。
//
//    kCAMediaTimingFunctionEaseInEaseOut创建了一个慢慢加速然后再慢慢减速 的过程。这是现实世界大多数物体移动的方式，也是大多数动画来说最好的选择。 如果只可以用一种缓冲函数的话，那就必须是它了。那么你会疑惑为什么这不是默 认的选择，实际上当使用 UIView 的动画方法时，他的确是默认的，但当创建 CAAnimation 的时候，就需要手动设置它了。
//
//    最后还有一个kCAMediaTimingFunctionDefault，它和kCAMediaTimingFunctionEaseInEaseOut很类似，但是加速和减速的过程都稍微有些慢。它和kCAMediaTimingFunctionEaseInEaseOut的区别很难察觉， 可能是苹果觉得它对于隐式动画来说更适合(然后对UIKit就改变了想法，而是使用kCAMediaTimingFunctionEaseInEaseOut作为默认效果)，虽然它的名字说 是默认的，但还是要记住当创建显式的CAAnimation它并不是默认选项(换句话说，默认的图层行为动画用kCAMediaTimingFunctionDefault作为它们的计时方法)。
        animation.delegate = self
        greedView.layer.add(animation, forKey: nil)
    }
    
    @objc func douDongEven(){
        
        let animati = CAKeyframeAnimation(keyPath: "transform.rotation")
        // rotation 旋转，需要添加弧度值
        // 角度转弧度
        animati.values = [angle2Radion(angle: -50), angle2Radion(angle: 50), angle2Radion(angle: -50)]
        animati.repeatCount = MAXFLOAT

        redView.layer.add(animati, forKey: nil)
    
        
    }
    
    func angle2Radion(angle: Float) -> Float {
        return angle / Float(180.0 * Double.pi)
    }
    

}

extension CAKeyAnimationViewController: CAAnimationDelegate {
    
    func animationDidStart(_ anim: CAAnimation) {
        
    }
    
    func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
        

    }
    
}
